当前位置:  开发笔记 > 编程语言 > 正文

|之间有什么区别?和|| 还是运营商?

如何解决《|之间有什么区别?和||还是运营商?》经验,为你挑选了4个好方法。

我一直||在OR表达式中使用(两个管道),包括C#和PHP.偶尔我会看到一个使用的管道:|.这两种用法有什么区别?当使用一个在另一个之上时是否有任何警告或者它们是否可以互换?



1> Michael Stum..:

就像&&&运算符一样,双运算符是一个"短路"运算符.

例如:

if(condition1 || condition2 || condition3)

如果condition1为true,则不检查条件2和3.

if(condition1 | condition2 | condition3)

这将检查条件2和3,即使1已经为真.由于您的条件可能是非常昂贵的功能,因此使用它们可以获得良好的性能提升.

有一个很大的警告,NullReferences或类似的问题.例如:

if(class != null && class.someVar < 20)

如果class为null,则if语句将在class != nullfalse 之后停止.如果你只使用&,它会尝试检查class.someVar你会得到一个很好的NullReferenceException.使用Or-Operator可能不是一个陷阱,因为你不太可能触发坏事,但这是要记住的事情.

但是,除非你的设计中每个条件都是要执行的函数,否则没有人会使用单个&|运算符.听起来像是一种设计气味,但有时(很少)这是一种干净的做事方式.该&操作者"跑这3个功能,如果其中一个返回false,执行else块",而|不会"只如果没有返回false运行else块" -可能是有用的,但正如所说,往往这是一个设计闻.

然而,第二次使用|&运算符:按位运算.


这不是黑客攻击,它的正式的C#第7.10.3布尔逻辑运算符规定:"X的结果|如果x或y是真实的y为true,否则,结果是假的." 另请参见第7.11节条件逻辑运算符:"操作x || y对应于操作x | y,但只有当x为false时才计算y." 进一步"合法化"| 作为条件运算符.如果他们只是盲目地认为那些东西是平等的,那么那些使用C/C++的人无论如何都会遇到麻烦.如上所述:使用| 在if语句中是一种设计气味,但是完全合法的操作.
教人们使用`&`和`|`作为条件运算符是一种破解,如果他们需要使用C/C++会让他们遇到麻烦:`1 && 2`是真的,而'1&2`是假的.
@ BlueRaja-DannyPflughoeft调用记录功能,黑客攻击时的文件说,它的目的是使用,就像使用switch语句"的elseif的黑客"的说法.它是工具箱中的工具,可能是一种很少使用的专用工具,但却是一种工具.
是的,在我创建一个控制台应用程序之前我不相信 - 但是好主!为什么他们会给你绳子自己挂!我讨厌VB.NET - OrElse和AndAlso关键字!
我从来没有说它不合法,只是它是一个黑客,它是*(你使用`&`传达一种意义,而不是它几乎总是意味着:按位 - 和*).
@ BlueRaja-DannyPflughoeft通过那个逻辑做而while循环在你的应用程序中没有位置,因为它们很少用于我做过的大多数商业应用程序开发.通过称之为黑客,您正在注入您的意见并假设没有合理的理由让任何人使用它.OP询问了它的不同之处以及使用它的注意事项.
如果它做了它做的事情,它不是一个黑客.
喜欢这些命令的短路特性!我一直使用此方法仅在第一次检查成功时才执行第二次检查,例如,空对象检查:if(myObj!= null && myObj.resultCode == 0)Console.WriteLine(“ Yay!”);
@Gent:编写软件时的第一条规则是使代码尽可能清晰可读.如果你使用的"很少使用"的语法没有正确地传达你的意图并且会让很多读者感到困惑,那么当有更清晰的选择时,它就是错误的代码.这是一个黑客.

2> Evan Shaw..:

|| 是逻辑OR运算符.听起来你基本上知道那是什么.它用于条件语句,如if,while等.

condition1 || condition2

如果condition1 OR condition2为true,则求值为true.

| 是按位OR运算符.它用于操作两个数字.您可以单独查看每个数字的每个位,如果其中一个位在至少一个数字中为1,那么结果位也将为1.这里有一些例子:

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

希望这是有道理的.

因此,为了回答最后两个问题,除了"了解两个运营商之间的区别"之外,我不会说任何警告.它们不可互换,因为它们完成两件完全不同的事情.



3> nsanders..:

一个是"按位或".

10011b | 01000b => 11011b

另一个是逻辑或.

true或false => true


`|`也可以用于`bool`类型,而不会发生短路。

4> Trevor Abell..:

好问题.这两个运算符在PHP和C#中的工作方式相同.

| 是一个按位OR.它将比较两个值的位.例如1101 | 0010 = 1111.这在使用位选项时非常有用.例如,读= 01(0X01)写= 10(0X02)读写= 11(0X03).一个有用的例子是打开文件.一个简单的例子是:

File.Open(FileAccess.Read | FileAccess.Write);  //Gives read/write access to the file

|| 是一个逻辑OR.这是大多数人对OR的看法,并根据他们的真相比较两个值.我要去商店,否则我会去商场.这是代码中最常用的一个.例如

if(Name == "Admin" || Name == "Developer") { //allow access } //checks if name equals Admin OR Name equals Developer

PHP资源:http://us3.php.net/language.operators.bitwise

C#资源:http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx


FWIW,从技术上讲,在C#`|`中是**逻辑或**应用于**布尔**.正如您的链接参考所述.在实践中,最终结果与它是一个按位运算符相同,因为"true"和"false"的按位值使得按位或其值产生与逻辑或完全相同的结果.那是`(int)(bool1 | bool2)`==`((int)bool1)| ((int)的BOOL2)`.
推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有